// 5、object  (类似any，实用性低)
let obj1: object   //能存储的类型是【非原始类型】
// object(小写)的含义：所有非原始类型，可存储：对象、函数、数组等，由于限制的范围比较宽泛，在实际开发中使用的相对较少
obj1 = {}
obj1 = {
    name: '夜南'
}
obj1 = [1, 2, 3, 4, 5]
obj1 = function () { }
obj1 = new String('123')   //这不是字符串，是一个字符串的包装对象
class Person1 { }
obj1 = new Person1()
// 以下代码不符合法则，会报错
// obj1 = 1
// obj1 = true
// obj1 = '你好'
// obj1 = null
// obj1 = undefined

let obj2: Object   // 能存储的是可以调用到Object方法的类型：比如Object.toString()
obj2 = [1, 2, 3, 4, 5]
obj2 = function () { }
obj2 = new String('123')   //这不是字符串，是一个字符串的包装对象
class Person2 { }
obj2 = new Person2()
obj2 = 1
obj2 = true
obj2 = '你好'
// 说白了，obj2是除了null和undefined不能存储其余的都能存储，作用仅次于any

//一、声明对象类型
let obj3: {
    name: string,
    age: number,
    hobby?: string,    //表示可有可没有
}
obj3 = {
    name: '夜南',
    age: 13
}
// 索引签名
let obj4: {
    name: string,
    age: number,
    [key: string]: any     //这样就可以在obj4里面写任意数量的key/value对象属性了
    // 对象的key、value的形式，变量名可以不是key，k、aaa、bbb、...等均可，可以自定义
    // 比如 [jndvsghjfvdjshg:string]:any
}
obj4 = {
    name: '夜南漫剪',
    age: 18,
    sex:"男",
    address:'地球'
}
// 签名索引：允许定义对象可以具有任意数量的属性，这些属性的键和类型是可变的，常用于：描述类型不确定的属性（具有定动态属性的对象）

// 二、声明函数类型
let fn1:(a:number,b:number) => number
// 公式   变量名：(参数1，参数2，...参数3) => 返回值类型限制
fn1 = function(x,y){
    return x+y
}
// 函数类型声明还可以使用:接口、自定义类型等方式，后续会详细介绍

// 三、声明数组类型
let arr1 :string[]    //第一种写法
arr1 = ['name','age']
let arr2 :Array<string>   //第二种写法  必须是Array(大写)
arr2 = ['name1','age2']
// Array<string> 属于泛型，后续会有详解